home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 September / september_2000.iso / intercd / root / ^Linux / WindowMaker / WINGs / wframe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-10-09  |  3.8 KB  |  216 lines

  1.  
  2. #include "WINGsP.h"
  3.  
  4.  
  5. typedef struct W_Frame {
  6.     W_Class widgetClass;
  7.     W_View *view;
  8.  
  9.     char *caption;
  10.  
  11.     
  12.     struct {
  13.     WMReliefType relief:4;
  14.     WMTitlePosition titlePosition:4;
  15.     } flags;
  16. } Frame;
  17.  
  18.  
  19. #define DEFAULT_RELIEF     WRGroove
  20. #define DEFAULT_TITLE_POSITION    WTPAtTop
  21. #define DEFAULT_WIDTH        40
  22. #define DEFAULT_HEIGHT        40
  23.  
  24.  
  25. static void destroyFrame(Frame *fPtr);
  26. static void paintFrame(Frame *fPtr);
  27.  
  28.  
  29.  
  30. void
  31. WMSetFrameTitlePosition(WMFrame *fPtr, WMTitlePosition position)
  32. {
  33.     fPtr->flags.titlePosition = position;
  34.     
  35.    if (fPtr->view->flags.realized) {
  36.     paintFrame(fPtr);
  37.     }
  38. }
  39.  
  40.  
  41. void
  42. WMSetFrameRelief(WMFrame *fPtr, WMReliefType relief)
  43. {
  44.     fPtr->flags.relief = relief;
  45.     
  46.    if (fPtr->view->flags.realized) {
  47.     paintFrame(fPtr);
  48.     }
  49. }
  50.  
  51.  
  52. void
  53. WMSetFrameTitle(WMFrame *fPtr, char *title)
  54. {
  55.     if (fPtr->caption)
  56.     wfree(fPtr->caption);
  57.     if (title)
  58.     fPtr->caption = wstrdup(title);
  59.     else
  60.     fPtr->caption = NULL;
  61.  
  62.    if (fPtr->view->flags.realized) {
  63.     paintFrame(fPtr);
  64.     }
  65. }
  66.  
  67.  
  68. static void
  69. paintFrame(Frame *fPtr)
  70. {
  71.     W_View *view = fPtr->view;
  72.     W_Screen *scrPtr = view->screen;
  73.     int tx, ty, tw, th;
  74.     int fy, fh;
  75.  
  76.     if (fPtr->caption!=NULL)
  77.     th = WMFontHeight(scrPtr->normalFont);
  78.     else {
  79.     th = 0;
  80.     }
  81.     
  82.     fh = view->size.height;
  83.     fy = 0;
  84.     
  85.     switch (fPtr->flags.titlePosition) {
  86.      case WTPAboveTop:
  87.     ty = 0;
  88.     fy = th + 4;
  89.     fh = view->size.height - fy;
  90.     break;
  91.     
  92.      case WTPAtTop:
  93.     ty = 0;
  94.     fy = th/2;
  95.     fh = view->size.height - fy;
  96.     break;
  97.     
  98.      case WTPBelowTop:
  99.     ty = 4;
  100.     fy = 0;
  101.     fh = view->size.height;
  102.     break;
  103.     
  104.      case WTPAboveBottom:
  105.     ty = view->size.height - th - 4;
  106.     fy = 0;
  107.     fh = view->size.height;
  108.     break;
  109.     
  110.      case WTPAtBottom:
  111.     ty = view->size.height - th;
  112.     fy = 0;
  113.     fh = view->size.height - th/2;
  114.     break;
  115.     
  116.      case WTPBelowBottom:
  117.     ty = view->size.height - th;
  118.     fy = 0;
  119.     fh = view->size.height - th - 4;
  120.     break;
  121.     
  122.      default:
  123.     ty = 0;
  124.     fy = 0;
  125.     fh = view->size.height;
  126.     }
  127. /*
  128.     XClearArea(scrPtr->display, view->window, fy+2, 2, fh-4, view->size.width-4,
  129.            False);
  130.  */
  131.     XClearWindow(scrPtr->display, view->window);
  132.     
  133.     W_DrawRelief(scrPtr, view->window, 0, fy, view->size.width, fh, 
  134.          fPtr->flags.relief);
  135.  
  136.     if (fPtr->caption!=NULL && fPtr->flags.titlePosition!=WTPNoTitle) {
  137.     
  138.     
  139.     tw = WMWidthOfString(scrPtr->normalFont, fPtr->caption, 
  140.              strlen(fPtr->caption));
  141.         
  142.     tx = (view->size.width - tw) / 2;
  143.     
  144.     XFillRectangle(scrPtr->display, view->window, WMColorGC(scrPtr->gray),
  145.                tx, ty, tw, th);
  146.  
  147.     WMDrawString(scrPtr, view->window, WMColorGC(scrPtr->black), 
  148.              scrPtr->normalFont, tx, ty, fPtr->caption,
  149.              strlen(fPtr->caption));
  150.     }
  151. }
  152.  
  153.  
  154.  
  155.  
  156.  
  157. static void
  158. handleEvents(XEvent *event, void *data)
  159. {
  160.     Frame *fPtr = (Frame*)data;
  161.  
  162.     CHECK_CLASS(data, WC_Frame);
  163.  
  164.     switch (event->type) {
  165.      case Expose:
  166.     if (event->xexpose.count!=0)
  167.         break;
  168.     paintFrame(fPtr);
  169.     break;
  170.     
  171.      case DestroyNotify:
  172.     destroyFrame(fPtr);
  173.     break;
  174.     }
  175. }
  176.  
  177.  
  178. WMFrame*
  179. WMCreateFrame(WMWidget *parent)
  180. {
  181.     Frame *fPtr;
  182.     
  183.     fPtr = wmalloc(sizeof(Frame));
  184.     memset(fPtr, 0, sizeof(Frame));
  185.  
  186.     fPtr->widgetClass = WC_Frame;
  187.  
  188.     fPtr->view = W_CreateView(W_VIEW(parent));
  189.     if (!fPtr->view) {
  190.     wfree(fPtr);
  191.     return NULL;
  192.     }
  193.     fPtr->view->self = fPtr;
  194.     
  195.     WMCreateEventHandler(fPtr->view, ExposureMask|StructureNotifyMask,
  196.              handleEvents, fPtr);
  197.  
  198.  
  199.     fPtr->flags.relief = DEFAULT_RELIEF;
  200.     fPtr->flags.titlePosition = DEFAULT_TITLE_POSITION;
  201.  
  202.     WMResizeWidget(fPtr, DEFAULT_WIDTH, DEFAULT_HEIGHT);
  203.     
  204.     return fPtr;
  205. }
  206.  
  207.  
  208. static void
  209. destroyFrame(Frame *fPtr)
  210. {    
  211.     if (fPtr->caption)
  212.     wfree(fPtr->caption);
  213.  
  214.     wfree(fPtr);
  215. }
  216.